package com.wink.admin.redis;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 缓存service
 *
 * @author xw
 * @date 2020/10/27 16:13
 */
public interface RedisService {


    /*====================String============================*/

    /**
     * 取值
     *
     * @param key key
     * @return
     */
    Object get(String key);

    /**
     * 赋值
     *
     * @param key         key
     * @param value       value
     * @param liveSeconds 过期时间，单位：秒
     */
    void set(String key, Object value, Long liveSeconds);

    /**
     * 赋值
     *
     * @param key   key
     * @param value value
     */
    void set(String key, Object value);

    /**
     * 存在则不设值返回false,不存在则设置返回true
     *
     * @param key
     */
    Boolean setnx(String key, Object value);

    Boolean setnx(String key, Object value, Long liveSeconds);

    /**
     * 设置键的字符串值并返回其旧值
     *
     * @param key
     * @param value
     * @return
     */
    Object getAndSet(String key, Object value);

    /*====================Hash============================*/

    /**
     * setToHash
     *
     * @param key
     * @param hashKey
     * @param value
     */
    void hset(String key, Object hashKey, Object value);

    /**
     * setToHash
     *
     * @param key    key
     * @param values Hash键值对
     */
    void hset(String key, Map<Object, Object> values);

    /**
     * getFromHash
     *
     * @param key
     * @param hashKey
     * @return
     */
    Object hget(String key, Object hashKey);

    /**
     * getFromHash
     *
     * @param key      key
     * @param hashKeys hash表字段
     * @return k=hashKey v=value
     */
    List<Object> hget(String key, Collection<Object> hashKeys);

    /**
     * hasHashKey
     *
     * @param key
     * @param hashKey
     * @return true 存在 、false 不存在
     */
    Boolean hasHashKey(String key, Object hashKey);

    /**
     * hashSize
     *
     * @param key
     * @return
     */
    Long hsize(String key);

    /**
     * deleteFromHash
     *
     * @param key
     * @param hashKeys
     */
    void hdelete(String key, Object... hashKeys);

    /*====================List============================*/

    /**
     * 向指定的列表左边插入数据
     *
     * @param key
     * @param value
     * @return
     */
    void lPush(String key, String value);

    void lPush(String key, Collection<Object> values);

    /**
     * 弹出指定列表右边的数据(如果没有数据,在指定的时间内等待)
     *
     * @param key
     * @param timeout
     * @param unit
     * @return
     */
    Object lRPop(String key, long timeout, TimeUnit unit);

    /*====================Set============================*/

    /**
     * getFromSet 所有
     *
     * @param key key
     * @return
     */
    Set<Object> sget(String key);

    /**
     * 往Set中存入数据
     *
     * @param key    Redis键
     * @param values 值
     * @return 存入的个数
     */
    Long sadd(String key, Object... values);

    /**
     * 删除Set中的数据
     *
     * @param key    Redis键
     * @param values 值
     * @return 移除的个数
     */
    Long sdelete(String key, Object... values);

    /**
     * 随机删除Set中的数据
     *
     * @param key   Redis键
     * @param count 总数，必须大于等于0
     * @return 移除的元素
     */
    List<Object> sdeleteRandom(String key, long count);

    /**
     * set中是否存在
     *
     * @param key
     * @param value
     * @return set是否存在
     */
    Boolean hasSetValue(String key, Object value);

    /**
     * 还有集合交、并、差集的操作不细写了，有需要增加
     */

    /*====================SortSet============================*/

    /**
     * 获得value得分
     *
     * @param key
     * @param value
     * @return
     */
    Double zgetVscore(String key, Object value);

    /**
     * zset add
     *
     * @param key
     * @param value
     * @param score
     * @return java.lang.Boolean
     */
    Boolean zadd(String key, Object value, double score);

    /**
     * 获取元素之间start和end的有序集合。
     *
     * @param key   key
     * @param start 开始位置
     * @param end   介绍位置
     * @return
     */
    Set<Object> range(String key, long start, long end);

    /**
     * 获取元素，其中得分之间的min和max的有序集合。
     *
     * @param key
     * @param min 最小分
     * @param max 最大分
     * @return
     */
    Set<Object> rangeByScore(String key, double min, double max);

    /**
     * 获取从范围内的元素start到end ，其中得分之间min和max从有序集合。
     *
     * @param key
     * @param min
     * @param max
     * @param start
     * @param end
     * @return
     */
    Set<Object> rangeByScore(String key, double min, double max, long start, long end);

    /**
     * 计数有序集合与之间的分数内的元件的数量min和max 。
     *
     * @param key
     * @param min
     * @param max
     * @return
     */
    Long count(String key, double min, double max);

    /**
     * zsize
     *
     * @param key
     * @return
     */
    Long zsize(String key);

    /**
     * zset 删除
     *
     * @param key
     * @param values
     * @return
     */
    Long zdelete(String key, Object... values);

    /*====================公用============================*/

    /**
     * 删除
     *
     * @param key key
     */
    void delete(String key);

    /**
     * 批量删除
     *
     * @param keys key
     */
    void deletes(Collection<String> keys);

    /**
     * 根据前缀模糊删除
     *
     * @param preKay
     */
    void deletePrefix(String preKay);

    /**
     * getExpire
     *
     * @param key key
     * @return
     */
    Long getExpire(String key);

    /**
     * 设置key过期
     *
     * @param key         key
     * @param liveSeconds 过期时间，单位：秒
     * @return
     */
    Boolean expire(String key, Long liveSeconds);

    /**
     * 是否存在key
     *
     * @param key
     * @return true 存在 、false 不存在
     */
    Boolean hasKey(String key);

    /**
     * increment
     *
     * @param key
     * @param value
     * @return
     */
    Long increment(String key, long value);

    /**
     * increment 1
     *
     * @param key
     * @return
     */
    Long increment(String key);

    /**
     * sendMessage
     *
     * @param channel
     * @param message
     */
    void sendMessage(String channel, Serializable message);
}